筆者已經用蠻多篇文章鼓勵演算法菜鳥工程師踏出第一步了
But!
But!!
這邊先踩個煞車!
先別那麼急著刷題!
(我又要開始搬運Huli的文章了)
如果你是剛開始寫code的超級菜鳥工程師,
強烈建議看完這兩篇Huli的文章!
[ALG101] 先別急著寫leetcode | Lidemy 鋰學院
程式解題新手入門注意事項- Huli
的確筆者也看到過很多(甚至是資工系的)新手,像Huli描述的一樣,
“可以獨立寫出一些簡單的應用程式,
可是對於一些我認為再簡單不過的題目,卻卡關卡很久。
例如說判斷質數、印出九九乘法表的那些題目”
這些新手也可能是看到簡單的題目時,想得到(暴力解的)作法
但是沒辦法很準確的把可以work的想法化成很正確的演算法
常常也沒辦法把正確的演算法寫成正確的code
遑論寫出能成功通過所有測資的code
如果讀者就是這麼新的新手
那可能直接開始leetcode的話學習曲線太陡峭了,
筆者建議先用一些比leetcode還簡單,有點練習程式語法意味的網站多做練習
Edabit
Codewars
(筆者是有實際用過這兩個網站的,題目品質都還不錯,
就是UX做的沒有Leetcode那麼好,而且題目難度離實際面試還有一段距離)
當你你開始熟悉這些非常簡單的練習把想法化成正確無誤的code的題目之後
可以再回到leetcode平台
寫一些最簡單的leetcode題目
首先是leetcode最簡單的一題 : LC2235
Add Two Integers - LeetCode
(這題卡關的話不要跟我說你是工程師....)
(題外話如果你覺得這題很簡單的話可以看看別人是怎麼寫這題的
21 different ways to solve this problem - LeetCode Discuss)
菜到不行的新手可以利用這題熟悉一下Leetcod的UI,
要怎麼一次測所有題目給的測資,
如何注意題目的Constraints,怎麼在console自定義想要測的測資,
怎麼樣是WA,怎麼樣會TLE,怎麼看討論區,
怎麼樣用printf或是console.log在leetcode平台debug
AC之後要怎麼看自己的memory和runtime分布,和看到別人的code都怎麼寫
這些基本的leetcode網站操作練熟之後再進到下一步
以上文字不夠精確的部分推一個圖文並茂的教學:
[番外篇] 解LeetCode 之前
再來,對於沒寫過Leetcode但在工作上已經不是菜鳥的工程師們
筆者推薦從這個網站的最後一題(leetcode最簡單的題目,題目rating 1084) 開始往回寫
https://zerotrac.github.io/leetcode_problem_rating/
(如果寫了3~5題左右覺得都太簡單,也可以去寫1200/1300/1400左右rating的題目)
這些是leetcode裡面最簡單的題目,解法應該不至於太難想到,
很多array相關的題目也不需要特別的基礎演算法先備知識(Tree/LinkedList那些),
新手可以多利用這些題目練習程式語法,和把自己的想法(演算法)化成正確無誤code的能力
要注意的是很多新手可能會看到這些題目會覺得很簡單懶得寫
但是實際上要真的寫到AC其實沒有想像中簡單,
雖然這些easy題不會在複雜度上限制太多,常常是暴力解寫出來就可以過,
但新手就是會在各種意想不到的地方忘記加大括號
變數複製過要改的時候忘記改名,if else裡面的判斷式寫出來的跟腦袋想的不一樣等等等等地方犯錯
先AC個20題再嫌題目簡單也不遲
筆者強烈建議踏出第一步(AC leetcode 2235)之後
可以先在這些題目裡面練習一陣子
一可以練手感練語法也練習細心地讀懂英文題目,
二可以給自己一些信心和成就感跟繼續熟悉leetcode這個平台
三可以用這些簡單的題目養成每天都要寫一點題目的習慣
如果array相關的題目都寫的差不多了,可能會發現有很多明明也是標Easy,AC率超高的題目看都看不懂或是解答看不懂,其實就是因為少了一些很基礎很重要的DSA先備知識,建議直接開始學習的DSA topic是
hash table (Leetcode天字號第一題就是在考hash table Two Sum - LeetCode)
linked-list
binary tree and recursion and dfs
stack and dfs
queue and bfs
關於這些topic的相關圖文教材可能要請讀者自行Google
筆者在 演算法比你想像的重要 一文中已經推薦過一些教材
我最喜歡的是
演算法學習之-Leetcode-破關總指南(一). 新手村與基本功訓練
和
neetcode
另外筆者聽過許多人都推薦Leetcode的 Explore Learn的教學和study plan(但筆者自己沒用過)
LeetCode Explore
LeetCode Study Plan
友站連結
刷題也算一種電競吧:演算法與資料結構筆者也覺得寫得很棒!
總之
慢慢練習慢慢讓自己看到題數有在增長,
練習持續地獲得成就感以建立正回饋迴路也是刷題之路不可或缺的一部分
然而
也千萬不要覺得自己刷rating1400以下的300題就跟別人leetcode寫300題一樣厲害了
題目難易度的差距是非常大的,
problem rating 1400以下題目的難度大概是一個contest rating 1800+工程師一天可以輕鬆寫50題的難度
如果發現1400以下的題目真的沒什麼好挑戰了
請趕快前進到下一步(下一篇文章)
挑戰大名鼎鼎的Blind 75 LeetCode Questions
題外話,如果你是超級英文苦手的工程師,最能把你難倒的部分是題目的英文敘述的話
Leetcode是有中文網站跟中文討論區的,而且題目和測資跟題號會跟英文那邊完全一模一樣
https://leetcode.cn/problems/add-two-integers/
(但是如果有以任何外商為目標的話完全不建議看中文的討論區...
你終究要學英文的... 為何不一開始就學..? 會錯失很多學習重要專有名詞的機會....)